#include "resource.h"

#include <windows.h>
#include <tchar.h>

#include "ugldialog.h"
#include "udlgapp.h"
#include "ucursor.h"

#include "adt/uautoptr.h"


// Yin-shaped cursor AND mask

BYTE ANDmaskCursor[] =
{
    0xFF, 0xFC, 0x3F, 0xFF,   // line 1
    0xFF, 0xC0, 0x1F, 0xFF,   // line 2
    0xFF, 0x00, 0x3F, 0xFF,   // line 3
    0xFE, 0x00, 0xFF, 0xFF,   // line 4

    0xF7, 0x01, 0xFF, 0xFF,   // line 5
    0xF0, 0x03, 0xFF, 0xFF,   // line 6
    0xF0, 0x03, 0xFF, 0xFF,   // line 7
    0xE0, 0x07, 0xFF, 0xFF,   // line 8

    0xC0, 0x07, 0xFF, 0xFF,   // line 9
    0xC0, 0x0F, 0xFF, 0xFF,   // line 10
    0x80, 0x0F, 0xFF, 0xFF,   // line 11
    0x80, 0x0F, 0xFF, 0xFF,   // line 12

    0x80, 0x07, 0xFF, 0xFF,   // line 13
    0x00, 0x07, 0xFF, 0xFF,   // line 14
    0x00, 0x03, 0xFF, 0xFF,   // line 15
    0x00, 0x00, 0xFF, 0xFF,   // line 16

    0x00, 0x00, 0x7F, 0xFF,   // line 17
    0x00, 0x00, 0x1F, 0xFF,   // line 18
    0x00, 0x00, 0x0F, 0xFF,   // line 19
    0x80, 0x00, 0x0F, 0xFF,   // line 20

    0x80, 0x00, 0x07, 0xFF,   // line 21
    0x80, 0x00, 0x07, 0xFF,   // line 22
    0xC0, 0x00, 0x07, 0xFF,   // line 23
    0xC0, 0x00, 0x0F, 0xFF,   // line 24

    0xE0, 0x00, 0x0F, 0xFF,   // line 25
    0xF0, 0x00, 0x1F, 0xFF,   // line 26
    0xF0, 0x00, 0x1F, 0xFF,   // line 27
    0xF8, 0x00, 0x3F, 0xFF,   // line 28

    0xFE, 0x00, 0x7F, 0xFF,   // line 29
    0xFF, 0x00, 0xFF, 0xFF,   // line 30
    0xFF, 0xC3, 0xFF, 0xFF,   // line 31
    0xFF, 0xFF, 0xFF, 0xFF    // line 32
};

// Yin-shaped cursor XOR mask

BYTE XORmaskCursor[] =
{
    0x00, 0x00, 0x00, 0x00,   // line 1
    0x00, 0x03, 0xC0, 0x00,   // line 2
    0x00, 0x3F, 0x00, 0x00,   // line 3
    0x00, 0xFE, 0x00, 0x00,   // line 4

    0x0E, 0xFC, 0x00, 0x00,   // line 5
    0x07, 0xF8, 0x00, 0x00,   // line 6
    0x07, 0xF8, 0x00, 0x00,   // line 7
    0x0F, 0xF0, 0x00, 0x00,   // line 8

    0x1F, 0xF0, 0x00, 0x00,   // line 9
    0x1F, 0xE0, 0x00, 0x00,   // line 10
    0x3F, 0xE0, 0x00, 0x00,   // line 11
    0x3F, 0xE0, 0x00, 0x00,   // line 12

    0x3F, 0xF0, 0x00, 0x00,   // line 13
    0x7F, 0xF0, 0x00, 0x00,   // line 14
    0x7F, 0xF8, 0x00, 0x00,   // line 15
    0x7F, 0xFC, 0x00, 0x00,   // line 16

    0x7F, 0xFF, 0x00, 0x00,   // line 17
    0x7F, 0xFF, 0x80, 0x00,   // line 18
    0x7F, 0xFF, 0xE0, 0x00,   // line 19
    0x3F, 0xFF, 0xE0, 0x00,   // line 20

    0x3F, 0xC7, 0xF0, 0x00,   // line 21
    0x3F, 0x83, 0xF0, 0x00,   // line 22
    0x1F, 0x83, 0xF0, 0x00,   // line 23
    0x1F, 0x83, 0xE0, 0x00,   // line 24

    0x0F, 0xC7, 0xE0, 0x00,   // line 25
    0x07, 0xFF, 0xC0, 0x00,   // line 26
    0x07, 0xFF, 0xC0, 0x00,   // line 27
    0x01, 0xFF, 0x80, 0x00,   // line 28

    0x00, 0xFF, 0x00, 0x00,   // line 29
    0x00, 0x3C, 0x00, 0x00,   // line 30
    0x00, 0x00, 0x00, 0x00,   // line 31
    0x00, 0x00, 0x00, 0x00    // line 32
};

using huys::UDialogBox;

class MyDialog : public UDialogBox
{
public:
    MyDialog(HINSTANCE hInst, UINT nID)
    : UDialogBox(hInst, nID),
      m_pCursor(0)
    {}

    virtual BOOL onInit()
    {
        m_pCursor = new UCursor;

        m_pCursor->createCursor( m_hInst,
             19,                // horizontal position of hot spot
             2,                 // vertical position of hot spot
             32,                // cursor width
             32,                // cursor height
             ANDmaskCursor,     // AND mask
             XORmaskCursor );   // XOR mask

        return TRUE;
    }

    virtual BOOL DialogProc(UINT message, WPARAM wParam, LPARAM lParam)
    {
        if (WM_SETCURSOR == message)
        {
            m_pCursor->use();
            return TRUE;
        }
        return UDialogBox::DialogProc(message, wParam, lParam);
    }
private:
    huys::ADT::UAutoPtr<UCursor> m_pCursor;
};

UDLGAPP_T(MyDialog, IDD_TEST);
